package main

import (
	"fmt"
	"os"
)

//给fmt.Println一个短的别名
type point struct {
	x, y int
}

func main() {
	p := point{1, 2}

	//打印结构体的实例
	fmt.Printf("%v\n", p) // {1,2}

	//如果值是一个结构体,%+v的格式化输出内容将包括结构体的字段名
	fmt.Printf("%+v\n", p) // {x:1 y:2}

	//	%#v形式则输出这个值的go语法表示
	fmt.Printf("%#v\n", p)

	//打印值的类型，使用%t
	fmt.Printf("%T\n", p)

	//打印bool值
	fmt.Printf("%t\n", true)

	//格式化整形数有多种方式，使用%d进行标准的十进制格式化
	fmt.Printf("%d\n", 123)

	//输出二进制的表现形式
	fmt.Printf("%b\n", 14)

	//这个输出给定整数的对应字符
	fmt.Printf("%c\n", 33)

	//%x提供十六进制编码
	fmt.Printf("%x\n", 456)

	//对于浮点型有很多格式化选项，使用%f进行最基本的十进制格式化
	fmt.Printf("%f\n", 78.9)

	// %e 和 %E 将浮点型格式化为（稍微有点不同的）科学计数法表示形式
	fmt.Printf("%e\n", 12340000.0)
	fmt.Printf("%E\n", 12340000.0)

	//%s字符串输出
	fmt.Printf("%s\n", "\"string\"")

	//带有双引号的输出使用 %q
	fmt.Printf("%q\n", "\"string\"")

	//和上面的整型数一样，`%x` 输出使用 base-16 编码的字符串，每个字节使用 2 个字符表示
	fmt.Printf("%x\n", "hex this")

	//输出指针的值使用%p
	fmt.Printf("%p\n", &p)

	// 当输出数字的时候，你将经常想要控制输出结果的宽度和精度，
	// 可以使用在 `%` 后面使用数字来控制输出宽度。
	// 默认结果使用右对齐并且通过空格来填充空白部分
	fmt.Printf("|%6d|%6d|\n", 12, 345)

	// 指定浮点型的输出宽度，同事通过宽度和精度的语法来指定输出的精度
	fmt.Printf("|%6.2f|%6.2f|", 1.2, 3.45)

	//要左对齐使用”-“
	fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)

	fmt.Printf("|%6s|%6s|\n", "foo", "b")

	fmt.Printf("|%-6s|%-6s|\n", "foo", "b")

	//输出格式化的字符串
	s := fmt.Sprintf("a %s", "string")
	fmt.Println(s)

	fmt.Fprintf(os.Stderr, "an %s\n", "error")
}
